/*
 *  listar_notas_response.cpp
 *  Wilson
 *
 *  Created by Sebastian Orfino on 11/15/11.
 *  Copyright 2011 lbs3. All rights reserved.
 *
 */
#include "VCPlugInHeaders.h"

//project include
#include "listar_notas_response.h"
#include "pugixml.hpp"

//stl includes
#include <string>
#include <functional>
#include <algorithm>
#include <sstream>


using namespace eventos;
using namespace xmp;

namespace  {
	/** Esta clase te construye el payload de este mensaje a partir de una coleccion de notas */
	class generar_payload : public std::unary_function<xmp::info_nota_t,void> {
		
		
		pugi::xml_document& doc;
		pugi::xml_node notas_n;
		
	public:
		
		generar_payload(pugi::xml_document& d);
		void operator()(const xmp::info_nota_t& nota);		
		
	};
	
	
	generar_payload::generar_payload(pugi::xml_document& d) : doc(d)
	{
		doc.load("<payload></payload>");
		pugi::xml_node payload_n = doc.child("payload");
		payload_n.append_attribute("mensaje") = kEventoListarNotasResponse;
		
		notas_n = payload_n.append_child(info_nota_t::bag_tag());
		
	}
	
	void generar_payload::operator()(const xmp::info_nota_t& nota)
	{
		using namespace pugi;
	
		xml_node nota_n = notas_n.append_child(info_nota_t::tag());
		
		xml_node id_n = nota_n.append_child(info_nota_t::id_tag());
		xml_node creador_n = nota_n.append_child(info_nota_t::creador_tag());
		xml_node timestamp_n = nota_n.append_child(info_nota_t::cuando_tag());
		xml_node mini_n = nota_n.append_child(info_nota_t::mini_tag());	
		xml_node color_n = nota_n.append_child(info_nota_t::color_tag());
		xml_node marcador_n = nota_n.append_child(info_nota_t::tiene_marcador_tag()); 
		
		id_n.append_child(node_pcdata).set_value(nota.id.c_str());
		creador_n.append_child(node_pcdata).set_value(nota.creador.c_str());
		timestamp_n.append_child(node_pcdata).set_value(nota.cuando.c_str());
		mini_n.append_child(node_cdata).set_value(nota.mini.c_str());
		color_n.append_child(node_pcdata).set_value(nota.color_hex.c_str());
		marcador_n.append_child(node_pcdata).set_value(nota.tiene_marcador ? "true" : "false");
		
	}
}



std::string listar_notas_response::payload() const 
{
	
	using namespace std;
	
	pugi::xml_document doc;
	for_each(notas_.begin(),notas_.end(),generar_payload(doc)); 

	std::ostringstream ostr;
	doc.save(ostr);
	return ostr.str(); 
	
}

